x86 hvm: Clean MSI related data when destroy domain.
authorKeir Fraser <keir.fraser@citrix.com>
Mon, 12 May 2008 09:06:40 +0000 (10:06 +0100)
committerKeir Fraser <keir.fraser@citrix.com>
Mon, 12 May 2008 09:06:40 +0000 (10:06 +0100)
Signed-off-by: Shan Haitao <Haitao.shan@intel.com>
xen/arch/x86/msi.c
xen/drivers/passthrough/vtd/iommu.c
xen/include/asm-x86/msi.h

index 3bc4abd283f8db7a3a47168d2aecf03905869d5f..bee19a2963b0ae605feb80a773b950e1c88c6344 100644 (file)
@@ -780,8 +780,16 @@ void pci_disable_msi(int vector)
         __pci_disable_msix(vector);
 }
 
-void pci_cleanup_msi(struct pci_dev *dev)
+void pci_cleanup_msi(u8 bus, u8 devfn)
 {
+    struct pci_dev *dev = get_msi_pdev(bus, devfn);
+
+    if ( !dev )
+        return;
     msi_free_vectors(dev);
+
+    /* Disable MSI and/or MSI-X */
+    msi_set_enable(dev, 0);
+    msix_set_enable(dev, 0);
 }
 
index ed4d2edaad2fc7ad62a7b61ba6c7bfabf39dcfed..7791c461109b31a0cde3485b91b49448df19cbe1 100644 (file)
@@ -1434,6 +1434,7 @@ void return_devices_to_dom0(struct domain *d)
     while ( !list_empty(&hd->pdev_list) )
     {
         pdev = list_entry(hd->pdev_list.next, typeof(*pdev), list);
+        pci_cleanup_msi(pdev->bus, pdev->devfn);
         reassign_device_ownership(d, dom0, pdev->bus, pdev->devfn);
     }
 
index 9cd34de8f916f34e08630aa730e4b9485c954a81..757bdfc135ab770abf1307630760e7ec51087368 100644 (file)
@@ -68,6 +68,7 @@ extern void write_msi_msg(unsigned int irq, struct msi_msg *msg);
 extern void set_msi_irq_affinity(unsigned int irq, cpumask_t mask);
 extern int pci_enable_msi(u8 bus, u8 devfn, int vector, int entry_nr, int msi);
 extern void pci_disable_msi(int vector);
+extern void pci_cleanup_msi(u8 bus, u8 devfn);
 
 struct msi_desc {
        struct {